This is no longer used as we neutered gdk_window_scroll & co.
append_uint32 (output, output->serial++);
}
-void
-broadway_output_copy_rectangles (BroadwayOutput *output, int id,
- BroadwayRect *rects, int n_rects,
- int dx, int dy)
-{
- int i;
-
- write_header (output, BROADWAY_OP_COPY_RECTANGLES);
- append_uint16 (output, id);
- append_uint16 (output, n_rects);
- for (i = 0; i < n_rects; i++)
- {
- append_uint16 (output, rects[i].x);
- append_uint16 (output, rects[i].y);
- append_uint16 (output, rects[i].width);
- append_uint16 (output, rects[i].height);
- }
- append_uint16 (output, dx);
- append_uint16 (output, dy);
-}
-
void
broadway_output_grab_pointer (BroadwayOutput *output,
int id,
void *data);
void broadway_output_surface_flush (BroadwayOutput *output,
int id);
-void broadway_output_copy_rectangles (BroadwayOutput *output,
- int id,
- BroadwayRect *rects,
- int n_rects,
- int dx,
- int dy);
void broadway_output_grab_pointer (BroadwayOutput *output,
int id,
gboolean owner_event);
} BroadwayEventType;
typedef enum {
- BROADWAY_OP_COPY_RECTANGLES = 'b',
BROADWAY_OP_GRAB_POINTER = 'g',
BROADWAY_OP_UNGRAB_POINTER = 'u',
BROADWAY_OP_NEW_SURFACE = 's',
BROADWAY_REQUEST_SHOW_WINDOW,
BROADWAY_REQUEST_HIDE_WINDOW,
BROADWAY_REQUEST_SET_TRANSIENT_FOR,
- BROADWAY_REQUEST_TRANSLATE,
BROADWAY_REQUEST_UPDATE,
BROADWAY_REQUEST_MOVE_RESIZE,
BROADWAY_REQUEST_GRAB_POINTER,
return server->output != NULL;
}
-static void
-_cairo_region (cairo_t *cr,
- const cairo_region_t *region)
-{
- cairo_rectangle_int_t box;
- gint n_boxes, i;
-
- g_return_if_fail (cr != NULL);
- g_return_if_fail (region != NULL);
-
- n_boxes = cairo_region_num_rectangles (region);
-
- for (i = 0; i < n_boxes; i++)
- {
- cairo_region_get_rectangle (region, i, &box);
- cairo_rectangle (cr, box.x, box.y, box.width, box.height);
- }
-}
-
-
-static void
-copy_region (cairo_surface_t *surface,
- cairo_region_t *area,
- gint dx,
- gint dy)
-{
- cairo_t *cr;
-
- cr = cairo_create (surface);
- cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
-
- _cairo_region (cr, area);
- cairo_clip (cr);
-
- /* NB: This is a self-copy and Cairo doesn't support that yet.
- * So we do a litle trick.
- */
- cairo_push_group (cr);
-
- cairo_set_source_surface (cr, surface, dx, dy);
- cairo_paint (cr);
-
- cairo_pop_group_to_source (cr);
- cairo_paint (cr);
-
- cairo_destroy (cr);
-}
-
-gboolean
-broadway_server_window_translate (BroadwayServer *server,
- gint id,
- cairo_region_t *area,
- gint dx,
- gint dy)
-{
- BroadwayWindow *window;
- gboolean sent = FALSE;
-
- window = g_hash_table_lookup (server->id_ht,
- GINT_TO_POINTER (id));
- if (window == NULL)
- return FALSE;
-
- if (window->last_synced &&
- server->output)
- {
- BroadwayRect *rects;
- cairo_rectangle_int_t rect;
- int i, n_rects;
-
- copy_region (window->last_surface, area, dx, dy);
- n_rects = cairo_region_num_rectangles (area);
- rects = g_new (BroadwayRect, n_rects);
- for (i = 0; i < n_rects; i++)
- {
- cairo_region_get_rectangle (area, i, &rect);
- rects[i].x = rect.x;
- rects[i].y = rect.y;
- rects[i].width = rect.width;
- rects[i].height = rect.height;
- }
- broadway_output_copy_rectangles (server->output,
- window->id,
- rects, n_rects, dx, dy);
- g_free (rects);
- sent = TRUE;
- }
-
- return sent;
-}
-
static void
diff_surfaces (cairo_surface_t *surface,
cairo_surface_t *old_surface)
context.drawImage(cmd.img, cmd.x, cmd.y);
break;
- case 'b': // copy rects
- context.save();
- context.beginPath();
-
- for (var j = 0; j < cmd.rects.length; j++) {
- var rect = cmd.rects[j];
- context.rect(rect.x, rect.y, rect.w, rect.h);
- }
- context.clip();
- // This seems to break chrome when src overlaps dest
- // But source-over should be fine for rgb surfaces anyway
- //context.globalCompositeOperation = "copy";
- context.drawImage(surface.canvas,
- cmd.dx, cmd.dy);
- context.restore();
- break;
-
default:
alert("Unknown drawing op " + cmd.op);
}
}
}
-static cairo_region_t *
-region_from_rects (BroadwayRect *rects, int n_rects)
-{
- cairo_region_t *region;
- cairo_rectangle_int_t *cairo_rects;
- int i;
-
- cairo_rects = g_new (cairo_rectangle_int_t, n_rects);
- for (i = 0; i < n_rects; i++)
- {
- cairo_rects[i].x = rects[i].x;
- cairo_rects[i].y = rects[i].y;
- cairo_rects[i].width = rects[i].width;
- cairo_rects[i].height = rects[i].height;
- }
- region = cairo_region_create_rectangles (cairo_rects, n_rects);
- g_free (cairo_rects);
- return region;
-}
-
void
add_client_serial_mapping (BroadwayClient *client,
guint32 client_serial,
BroadwayReplyQueryMouse reply_query_mouse;
BroadwayReplyGrabPointer reply_grab_pointer;
BroadwayReplyUngrabPointer reply_ungrab_pointer;
- cairo_region_t *area;
cairo_surface_t *surface;
guint32 before_serial, now_serial;
request->set_transient_for.id,
request->set_transient_for.parent);
break;
- case BROADWAY_REQUEST_TRANSLATE:
- area = region_from_rects (request->translate.rects,
- request->translate.n_rects);
- broadway_server_window_translate (server,
- request->translate.id,
- area,
- request->translate.dx,
- request->translate.dy);
- cairo_region_destroy (area);
- break;
case BROADWAY_REQUEST_UPDATE:
surface = broadway_server_open_surface (server,
request->update.id,
BROADWAY_REQUEST_SET_TRANSIENT_FOR);
}
-gboolean
-_gdk_broadway_server_window_translate (GdkBroadwayServer *server,
- gint id,
- cairo_region_t *area,
- gint dx,
- gint dy)
-{
- BroadwayRequestTranslate *msg;
- cairo_rectangle_int_t rect;
- int i, n_rects;
- gsize msg_size;
-
- n_rects = cairo_region_num_rectangles (area);
-
- msg_size = sizeof (BroadwayRequestTranslate) + (n_rects-1) * sizeof (BroadwayRect);
- msg = g_malloc (msg_size);
-
- msg->id = id;
- msg->dx = dx;
- msg->dy = dy;
- msg->n_rects = n_rects;
-
- for (i = 0; i < n_rects; i++)
- {
- cairo_region_get_rectangle (area, i, &rect);
- msg->rects[i].x = rect.x;
- msg->rects[i].y = rect.y;
- msg->rects[i].width = rect.width;
- msg->rects[i].height = rect.height;
- }
-
- gdk_broadway_server_send_message_with_size (server, (BroadwayRequestBase *)msg, msg_size,
- BROADWAY_REQUEST_TRANSLATE);
- g_free (msg);
- return TRUE;
-}
-
static void *
map_named_shm (char *name, gsize size)
{